package com.tsyz.servlet.config;


import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.validation.annotation.Validated;

import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;


@Data
// 绑定配置，启用校验（依赖spring-boot-starter-validation，属于Spring Boot默认依赖）
// 绑定配置文件中的"thread-pool"前缀
@ConfigurationProperties(prefix = "thread-pool")
@Validated
public class ThreadPoolProperties {
    /**
     * 为每个业务线程池提供默认实例（避免配置文件遗漏导致null）
     */
    private PoolConfig query = new PoolConfig();
    private PoolConfig submitCompliance = new PoolConfig();

    @Data
    public static class PoolConfig {
        // 核心线程数：默认CPU核心数*2（I/O密集型推荐值）
        @Min(value = 1, message = "核心线程数不能小于1")
        private int corePoolSize = Runtime.getRuntime().availableProcessors() * 2;

        // 最大线程数：默认核心线程数*2（避免过大导致上下文切换开销）
        @Min(value = 1, message = "最大线程数不能小于1")
        private int maxPoolSize = corePoolSize * 2;

        // 队列容量：默认100（根据内存调整，避免OOM）
        @Min(value = 1, message = "队列容量不能小于1")
        private int queueCapacity = 100;

        // 空闲线程存活时间：默认60秒
        private int keepAliveSeconds = 60;

        // 线程名前缀：必须配置（强制业务标识，便于排查）
        @NotBlank(message = "线程名前缀不能为空（需包含业务标识，如'query-task-'）")
        private String threadNamePrefix;

        // 拒绝策略：默认CALLER_RUNS（适合非核心任务，避免丢失）
        private String rejectedPolicy = "CALLER_RUNS";

        // getter/setter（注意 maxPoolSize 与 corePoolSize 的联动）
        public void setCorePoolSize(int corePoolSize) {
            this.corePoolSize = corePoolSize;
            // 若maxPoolSize未手动配置，随corePoolSize自动调整
            if (this.maxPoolSize == (Runtime.getRuntime().availableProcessors() * 2) * 2) {
                this.maxPoolSize = corePoolSize * 2;
            }
        }
    }
}